#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+2,maxq=1e6+2;
const int allmod=147744151;
int n,m,Q;
int mod;
int ar[maxn][maxn],lk[maxn];
struct node_Q{
    int ax,ay,bx,by,id;
}q[maxq];
struct BIT{
    int t[maxn];
    void init(){
        for(int i=1;i<=n;i++)t[i]=1;
        return ;
    }
    int lowbit(int x){return x&-x;}
    void modify(int x,int v){
        for(int i=x;i<=n;i+=lowbit(i))t[i]=1ll*t[i]*v%mod;
        return ;
    }
    int query(int x){
        int ret=1;
        for(int i=x;i;i-=lowbit(i))ret=1ll*ret*t[i]%mod;
        return ret;
    }
};
struct SEGTREE2{
    struct node{
        int ls,rs,l,r;
        BIT bit;
    }t[maxn<<2];
    void build(int x,int l,int r){
        t[x].l=l,t[x].r=r,t[x].bit.init();
        if(l==r){
            t[x].ls=t[x].rs=0;
            return ;
        }
        t[x].ls=(x<<1),t[x].rs=(x<<1|1);
        int mid=(t[x].l+t[x].r)>>1;
        build(t[x].ls,l,mid);
        build(t[x].rs,mid+1,r);
    }
    void modify(int x,int pm,int pn,int v){
        t[x].bit.modify(pn,v);
        if(t[x].l==t[x].r)return ;
        int mid=(t[x].l+t[x].r)>>1;
        if(pm<=mid)modify(t[x].ls,pm,pn,v);
        else modify(t[x].rs,pm,pn,v);
        return ;
    }
    int query(int x,int l,int r,int R){
        if(t[x].l==t[x].r)return t[x].bit.query(R);
        int mid=(t[x].l+t[x].r)>>1;
        if(l>mid)return query(t[x].rs,l,r,R);
        else if(r<=mid)return query(t[x].ls,l,r,R);
        else {
            return 1ll*query(t[x].ls,l,mid,R)*query(t[x].rs,mid+1,r,R)%mod;
        }
    }
}segt;
int read(){
    int x=0,f=1;
    char ch=getchar();
    while(!isdigit(ch))f=(ch=='-')?(-f):f,ch=getchar();
    while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    return x*f;
}
bool cmp(node_Q A,node_Q B){
    return A.ax>B.ax;
}
int main(){
    freopen("tsuki.in","r",stdin);
    freopen("tsuki.out","w",stdout);
    double st=clock(),ed;
    n=read(),m=read(),mod=read();
    segt.build(1,1,m);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            ar[i][j]=read();
            // segt2.modify(1,j,i,ar[i][j]);
        }
    }
    ed=clock();
    cerr<<ed-st<<'\n';
    int ans=0;
    scanf("%d",&Q);
    for(int i=1,ret;i<=Q;i++){
        // printf("query %d\n",i);
        q[i].id=i;
        q[i].ax=read(),q[i].ay=read(),q[i].bx=read(),q[i].by=read();
    }
    sort(q+1,q+Q+1,cmp);
    int tp=n,ret;
    for(int i=1;i<=Q;i++){
        while(tp>=q[i].ax){
            for(int j=1;j<=m;j++)segt.modify(1,j,tp,ar[tp][j]);
            tp--;
        }
        ret=segt.query(1,q[i].ay,q[i].by,q[i].bx);
        ans=(ans+(ret^q[i].id))%allmod;
        // printf("%d\n",ret);
    }
    printf("%d\n",ans);
    ed=clock();
    cerr<<ed-st<<'\n';
    return 0;   
}